//
//  sqliteData.m
//  城市选择之读取数据库
//
//  Created by dllo on 16/8/25.
//  Copyright © 2016年 DM.C. All rights reserved.
//

#import "sqliteData.h"
#import "City.h"
@implementation sqliteData
+ (sqliteData *)sharedManager {
    static sqliteData *manager = nil;
    // 保证线程安全的情况下, 只执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[sqliteData alloc] init];
    });
    return manager;
}
- (BOOL)openSQLite3 {
//    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//    NSString *douctment = [pathArray firstObject];
//    // 数据库SQLite3文件类型  .db
//    NSString *dbPath = [douctment stringByAppendingPathComponent:@"student.db"];
//    NSLog(@"%@", dbPath);
    // UTF8String 属性 为将OC字符串转换成C语言字符串
    // 参数1: 数据库文件路径
    // 参数2: 指向指针的指针 该指针可以被修改 数据库管理指针
    int result = sqlite3_open([@"/Users/dllo/Desktop/练习/城市选择之读取数据库/城市选择之读取数据库/cityData.sqlite" UTF8String], &dbPonint);
    return [self isOperationResult:result alertText:@"打开数据库"];
    }

- (BOOL)closeSQLite3 {
    // 关闭数据库时, 如果数据库处于打开状态, 则正常关闭, 显示成功
    // 如果数据库处于关闭状态, 则显示失败, 原因 21:库不存在
    int result = sqlite3_close(dbPonint);
    return [self isOperationResult:result alertText:@"关闭数据库"];
}
- (NSArray *)selectAll {
    // select 字段名, 字段名... from 表名 where 条件
    NSString *selectAll = @"select * from city";
    sqlite3_stmt *stmt = NULL;
    // 参数1: 数据库指针 sqlite3 *
    // 参数2: 数据库的SQL语句
    // 参数3: SQL语句的长度, -1
    // 参数4: 替身, 查询出的内容放入替身中, 并将替身反回
    // 参数5:
    int result = sqlite3_prepare(dbPonint, [selectAll UTF8String], -1, &stmt, NULL);
    NSMutableArray *stuArray = [NSMutableArray array];
    // 如果查询结果为成功
    if (result == SQLITE_OK) {
        // 循环遍历替身内容
        // step查询替身中有没有其他数据
        // 当包含有其他数据时, 结果为 SQLITE_ROW
        // 当不包含有其他数据时, 结果为 SQLITE_DONE
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 循环体中, 取对应的每一列数据
            // 取出第0列的数据, 根据类型选择函数, text
            int cityId = sqlite3_column_int(stmt, 2);
            // 取出第1列的数据, 根据类型选择函数, text
            const unsigned char *stu_name = sqlite3_column_text(stmt, 1);
            City *city = [[City alloc] init];
            city.postcode = cityId;
            city.city_name =[NSString stringWithUTF8String:(const char *)stu_name];
            [stuArray addObject:city];
        }
    }
    // 循环结束后, 销毁替身
    sqlite3_finalize(stmt);
    return stuArray;
}
- (BOOL)isOperationResult:(int)result alertText:(NSString *)text {
    BOOL isOperation = YES;
    if (result == SQLITE_OK) {
        NSLog(@"%@成功" ,text);
        isOperation = YES;
    } else {
        NSLog(@"%@失败-----%d",text, result);
        isOperation = NO;
    }
    return isOperation;
}

@end
